複数のWeb Workerに処理を分散させるscript
外部からは普通のWeb Workerとして使えて、内部で複数のWebWorkerに処理を分散させるscript Interface
code:js
const calculate = createMultiWorker('worker-src');
await Promise.all(promises.then(result => ...));
createMultiWorker();
WebWorkerを生成し、それを使った処理関数calculateを返す
calculate()
戻り値に内部のWebWorkerの個数分のPromiseを返す
それぞれのPromiseを解決すると、処理結果が返ってくる
WebWorker側のcodeでは、message.dataで受け取る
code:script.js
export function createMultiWorker(workerSrc) {
.map(_ => new Worker(workerSrc));
return (messages) => {
const promises = [];
// messagesを分割する
const chunkLength = Math.floor(messages.length/workers.length) + 1;
for (let i = 0; i < workers.length; i++) {
const chunk = messages.slice(i * chunkLength, (i + 1) * chunkLength));
promises.push(new Promise((resolve) => {
workeri.postMessage(chunk); workeri.addEventListener('message', ({data}) => resolve(data), {once: true}); });
}
return promises;
};
}